package com.yunkeji.common.enums.app;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.json.JSONUtil;

import com.yunkeji.common.exception.AppServiceException;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.experimental.Accessors;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

@Getter
@AllArgsConstructor
public enum CheckType {
    真人认证(1, VideoAuth.class),
    实名认证(2, RealAuth.class),
    头像认证(3, HeadAuth.class),
    视频介绍认证(4, CoverVideoAuth.class),
    封面相册认证(5, CoverAlbumAuth.class),
    语音介绍认证(6, VoiceAuth.class),
    昵称认证(7, NickNameAuth.class); // 不要了
    private Integer code;
    private Class checkObj;

    public static CheckType getByCode(Integer code) {
        CheckType[] values = CheckType.values();
        Optional<CheckType> first =
                Arrays.stream(values).filter(item -> item.getCode().equals(code)).findFirst();
        if (first.isPresent()) {
            return first.get();
        } else {
            throw AppServiceException.paramException("认证类型参数异常");
        }
    }

    public interface Res {
        List<String> getRes();
    }

    /** 真人认证 */
    @Data
    @Accessors(chain = true)
    public static class VideoAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.resUrl);
        }

        /** 资源链接 */
        private String resUrl;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 实名认证 */
    @Data
    @Accessors(chain = true)
    public static class RealAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.resUrl);
        }

        /** 身份证号码 */
        private String cardNum;

        /** 真实姓名 */
        private String realName;

        /** 资源链接 */
        private String resUrl;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 昵称 */
    @Data
    @Accessors(chain = true)
    public static class NickNameAuth implements Res {

        @Override
        public List<String> getRes() {
            return null;
        }

        /** 昵称 */
        private String nickName;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 头像 */
    @Data
    @Accessors(chain = true)
    public static class HeadAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.headUrl);
        }

        /** 头像 */
        private String headUrl;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 头像 */
    @Data
    @Accessors(chain = true)
    public static class VoiceAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.voiceUrl);
        }

        /** 头像 */
        private String voiceUrl;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 封面 */
    @Data
    @Accessors(chain = true)
    public static class CoverVideoAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.videoIntro, this.videoIntroCoverGif, this.videoIntroCover);
        }

        /** 封面 */
        private String videoIntro;

        /** 视频介绍-封面-gif */
        private String videoIntroCoverGif;

        /** 视频介绍-封面 */
        private String videoIntroCover;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }

    /** 封面 */
    @Data
    @Accessors(chain = true)
    public static class CoverAlbumAuth implements Res {

        @Override
        public List<String> getRes() {
            return ListUtil.of(this.coverUrl);
        }

        /** 封面 */
        private String coverUrl;

        /** 相册id */
        private Long albumId;

        @Override
        public String toString() {
            return JSONUtil.toJsonStr(this);
        }
    }
}
